package com.fhx.core.utils

import java.math.BigDecimal
import java.text.NumberFormat


/**
 * 运算工具
 */
object AriThUtil {

    /**
     * 加法
     * @param v1 被加数
     * @param v2 加数
     */
    fun add(v1: Double, v2: Double): Double {
        val b1 = BigDecimal(v1.toString())
        val b2 = BigDecimal(v2.toString())
        return b1.add(b2).toDouble()
    }

    /**
     * 减法
     * @param v1 被减数
     * @param v2 减数
     */
    fun sub(v1: Double, v2: Double): Double {
        val b1 = BigDecimal(v1.toString())
        val b2 = BigDecimal(v2.toString())
        return b1.subtract(b2).toDouble()
    }

    /**
     * 提供精确的乘法运算。
     * @param v1 被乘数
     * @param v2 乘数
     */
    fun mul(v1: Double, v2: Double): Double {
        val b1 = BigDecimal(v1.toString())
        val b2 = BigDecimal(v2.toString())
        return b1.multiply(b2).toDouble()
    }

    /**
     * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指
     * 定精度，以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    fun div(v1: Double, v2: Double, scale: Int): Double {
        require(scale >= 0) { "The scale must be a positive integer or zero" }
        val b1 = BigDecimal(v1.toString())
        val b2 = BigDecimal(v2.toString())
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toDouble()
    }

    fun formatDouble(d: Double, newValue: Int): String {
        val nf = NumberFormat.getInstance()
        //设置保留多少位小数
        nf.maximumFractionDigits = newValue
        // 取消科学计数法
        nf.isGroupingUsed = false
        //返回结果
        return nf.format(d)
    }

    // 截取小数点后四位
    fun afterDotNumber4(number: Double): Double {
        var result = 0.0000
        result = Math.floor(number * 10000) / 10000
        return result
    }
}